#!/bin/bash

# ==========================================================
# Docker CE for Ubuntu (Jammy/22.04) 自动安装脚本
# 目的：解决 GPG 密钥下载时的网络连接重置问题
# ==========================================================

echo "### 1. 正在清理旧的 Docker 镜像源配置..."
# 清理之前添加的 docker.list 文件，包括可能存在的阿里云或旧配置
sudo rm -f /etc/apt/sources.list.d/docker.list

# 确保安装了 curl 和 gpg 等工具
sudo apt update
sudo apt install -y curl gpg

echo "### 2. 正在尝试下载 Docker GPG 密钥并配置官方源..."

GPG_KEYRING="/usr/share/keyrings/docker-archive-keyring.gpg"
GPG_URL="https://download.docker.com/linux/ubuntu/gpg"
MAX_RETRIES=5
RETRY_COUNT=0

# 循环重试下载 GPG 密钥，以解决 'Connection reset by peer' 问题
while [ $RETRY_COUNT -lt $MAX_RETRIES ]; do
    echo "尝试下载 GPG 密钥 (第 $((RETRY_COUNT + 1)) 次)..."
    
    # 使用 curl 下载 GPG 密钥，并强制覆盖 (y) 现有的 keyring 文件
    if curl -fsSL $GPG_URL | sudo gpg --dearmor -o $GPG_KEYRING; then
        echo "GPG 密钥下载成功！"
        break
    else
        echo "GPG 密钥下载失败。可能出现网络错误或连接重置。"
        RETRY_COUNT=$((RETRY_COUNT + 1))
        if [ $RETRY_COUNT -eq $MAX_RETRIES ]; then
            echo "错误：尝试 $MAX_RETRIES 次后 GPG 密钥仍无法下载。请检查您的网络设置。"
            exit 1
        fi
        sleep 5  # 等待 5 秒后重试
    fi
done

# 如果成功下载 GPG 密钥，则添加 Docker 官方仓库
if [ -f $GPG_KEYRING ]; then
    echo "### 3. 正在添加 Docker 官方仓库..."
    
    # 获取系统架构和发行版代号 (如 jammy)
    ARCH=$(dpkg --print-architecture)
    CODENAME=$(lsb_release -cs)
    
    # 写入官方源配置到新的 docker.list 文件
    echo "deb [arch=$ARCH signed-by=$GPG_KEYRING] https://download.docker.com/linux/ubuntu $CODENAME stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
else
    echo "无法继续：GPG 密钥不存在。"
    exit 1
fi

echo "### 4. 正在更新软件包索引并安装 Docker 软件包..."

# 刷新软件包索引
sudo apt update

# 安装 Docker 核心组件
sudo apt install -y docker-ce docker-ce-cli containerd.io

echo "### 5. 正在验证 Docker 安装..."

# 验证安装是否成功
if sudo docker version; then
    echo "=========================================="
    echo "✅ Docker 安装成功！"
    echo "=========================================="
else
    echo "=========================================="
    echo "❌ Docker 安装失败或验证失败，请检查上面的错误信息。"
    echo "=========================================="
fi

# 提示非 root 用户使用 docker 的设置
echo "提示：如需非 root 用户使用 Docker，请运行以下命令："
echo "sudo usermod -aG docker \$USER"
echo "然后重新登录会话或重启终端。"